// Copyright (C) 2022 即时通讯网(52im.net) & Jack Jiang.
// The RainbowChat Project. All rights reserved.
//
// 【本产品为著作权产品，合法授权后请放心使用，禁止外传！】
// 【本次授权给：<广西木子科技有限公司>，授权编号：<NT220402151538>，代码指纹：<A.648883738.885>，技术对接人微信：<ID: Lingmuziyi>】
// 【授权寄送：<收件：李先生、地址：南宁市科园西十路11号国电智能大厦1101F、电话：17736659550、邮箱：yingshashou@vip.qq.com>】
//
// 【本系列产品在国家版权局的著作权登记信息如下】：
// 1）国家版权局登记名(简称)和权证号：RainbowChat    （证书号：软著登字第1220494号、登记号：2016SR041877）
// 2）国家版权局登记名(简称)和权证号：RainbowChat-Web（证书号：软著登字第3743440号、登记号：2019SR0322683）
// 3）国家版权局登记名(简称)和权证号：RainbowAV      （证书号：软著登字第2262004号、登记号：2017SR676720）
// 4）国家版权局登记名(简称)和权证号：MobileIMSDK-Web（证书号：软著登字第2262073号、登记号：2017SR676789）
// 5）国家版权局登记名(简称)和权证号：MobileIMSDK    （证书号：软著登字第1220581号、登记号：2016SR041964）
// * 著作权所有人：江顺/苏州网际时代信息科技有限公司
//
// 【违法或违规使用投诉和举报方式】：
// 联系邮件：jack.jiang@52im.net
// 联系微信：hellojackjiang
// 联系QQ号：413980957
// 授权说明：http://www.52im.net/thread-1115-1-1.html
// 官方社区：http://www.52im.net
package com.x52im.rainbowchat.im.impl;

import io.netty.channel.Channel;

import java.util.Set;
import java.util.concurrent.ConcurrentMap;

import net.x52im.mobileimsdk.server.processor.OnlineProcessor;

import com.eva.epc.common.util.CommonUtils;
import com.eva.framework.utils.LoggerFactory;
import com.x52im.rainbowchat.http.logic.LogicProcessor2;

/**
 * 用户在线状态逻辑管理器.
 *
 * @author Jack Jiang(http://www.52im.net/space-uid-1.html)
 * @version 1.0
 */
public class UsersStatusManager {
    public UsersStatusManager() {
        // 保证服务器重置时能无条件重置用户的“是否在线”状态
        resetUserOnlieStatusToDB();
    }

    /**
     * 用户是否在线.
     *
     * @param uid 此参数为必须项
     * @return
     */
    public boolean isOnline(String uid) {
        return OnlineProcessor.isOnline(uid);
    }

    /**
     * 用户上线.
     *
     * @param uidOrMail
     * @param user_id
     */
    public void userOnline(String user_id) {
        // 将用户上线状态更新至用户数据库表中
        userOnlineToDB(user_id);
    }

    /**
     * 用户下线.
     *
     * @param uidOrMail
     */
    public void userOffline(String uidOrMail) {
        // 将用户离线状态更新至数据库表中
        userOfflineToDB(uidOrMail);
    }

    public ConcurrentMap<String, Channel> getLiveUsers() {
        return OnlineProcessor.getInstance().getOnlineSessions();
    }

    public void printLiveUsers() {
        Set<String> keys = getLiveUsers().keySet();
        LoggerFactory.getLog().debug("[RBChat]<----------当前在线用户共(" + keys.size() + ")人--------->");
//		for(String key : keys)
//			LoggerFactory.getLog().debug("uidOrMail="+key+",user_id="+liveUsers.get(key));
    }

    //----------------------------------------------------------------------------------------

    /**
     * 无条件重置用户列中的“是否在线”字段为“不在线”.
     *
     * <p>
     * 通常会在服务端重启时无条件重置一次，保证服务端因意外终止时未及时重置的用户在线状态能被正确重置.
     */
    private boolean resetUserOnlieStatusToDB() {
        boolean sucess = false;
        try {
            LogicProcessor2.db.update("update missu_users set is_online=0", new Object[]{}, true);
            sucess = true;
        } catch (Exception e) {
            if (e instanceof IllegalArgumentException) {
                LoggerFactory.getLog().debug("[RBChat]resetUserOnlieStatusToDB()时，影响行数为0，" +
                        "原因应是之前的用户在线状态已被全部正常复位，请忽略本条Log哦。(DEBUG INFO：" + e.getMessage() + ")");
            } else {
                LoggerFactory.getLog().warn("[RBChat]resetUserOnlieStatusToDB()用户在线状态时有问题哦，", e);
            }
        }
        return sucess;
    }

    /**
     * 将用户上线状态更新至用户数据库表中.
     *
     * @param uidOrMail
     * @return
     */
    private boolean userOnlineToDB(String uidOrMail) {
        return _userIsOnlineStatusUpdateToDB(true, uidOrMail);
    }

    /**
     * 将用户离线状态更新至数据库表中.
     *
     * @param uidOrMail
     * @return
     */
    private boolean userOfflineToDB(String uidOrMail) {
        return _userIsOnlineStatusUpdateToDB(false, uidOrMail);
    }

    private boolean _userIsOnlineStatusUpdateToDB(boolean online, String uidOrMail) {
        boolean sucess = false;
        try {
            LogicProcessor2.db.update(
                    "update missu_users set is_online=" + (online ? 1 : 0)
                            + " where " + (CommonUtils.isEmail(uidOrMail) ? "user_mail='" + uidOrMail + "'" : "user_uid=" + uidOrMail)
//						+" where (ltrim(str(user_uid))='"+uidOrMail+"' or user_mail='"+uidOrMail+"')"
                    , new Object[]{}, true);
            sucess = true;
        } catch (Exception e) {
            if (e instanceof IllegalArgumentException) {
                LoggerFactory.getLog().debug("[RBChat]_userIsOnlineStatusUpdateToDB()时，影响行数为0，" +
                        "原因应是用户" + uidOrMail + "的在线状态已被正常复位，请忽略本条Log哦。(DEBUG INFO：" + e.getMessage() + ")");
            } else {
                LoggerFactory.getLog().warn("[RBChat]_userIsOnlineStatusUpdateToDB()用户在线状态时有问题哦，", e);
            }
        }
        return sucess;
    }
}
